Advanced Topics এবং Entity Framework Best Practices

Microsoft Technologies - এন্টিটি ফ্রেমওয়র্ক (Entity Framework)
216
216

Entity Framework (EF) একটি শক্তিশালী ORM (Object-Relational Mapping) টুল যা ডেভেলপারদের ডেটাবেসের সাথে কাজ করার জন্য সহজ এবং কার্যকর উপায় প্রদান করে। তবে, বেশ কিছু উন্নত বৈশিষ্ট্য এবং কৌশল রয়েছে যেগুলি ব্যবহার করে আপনি Entity Framework-এ আরও দক্ষতা, পারফরম্যান্স এবং নিরাপত্তা নিশ্চিত করতে পারেন। এখানে আমরা কিছু Advanced Topics এবং Best Practices নিয়ে আলোচনা করব যা EF ব্যবহারকারীদের জন্য উপকারী।


Complex Type এবং Value Object ব্যবহার

Complex Types এবং Value Objects এমন ধারণা যা ডোমেন-ড্রিভেন ডিজাইন (DDD) এর মধ্যে ব্যবহৃত হয়। এই ধারণাগুলি ব্যবহার করে আপনি ডোমেন মডেলগুলোকে আরও পরিষ্কার এবং শক্তিশালী করতে পারেন।

  • Complex Type: এটি একটি ক্লাস যা অন্য ক্লাসের প্রপার্টি হিসেবে ব্যবহৃত হয় কিন্তু নিজের কোনো আলাদা টেবিল বা ডেটাবেস এন্টিটি থাকে না। এটি শুধুমাত্র ডেটার বৈশিষ্ট্য ধারণ করে, যেমন একটি ঠিকানা ক্লাস (Address) যা স্ট্রিট, সিটি, পোস্টাল কোড ইত্যাদি ধারণ করতে পারে।
  • Value Object: এটি একটি অবজেক্ট যেটি কোনো নির্দিষ্ট আইডেন্টিটি বা অবস্থান রাখে না। এর মান শুধু তার ভ্যালু দ্বারা পরিচিত।

Example: Complex Type in Entity Framework

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
}

public class Customer
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; } // Complex Type
}

এখানে, Address ক্লাসটি একটি Complex Type, যেটি Customer ক্লাসে ব্যবহৃত হয়েছে। EF নিজে এটি ডেটাবেসের একটি একক টেবিল হিসেবে মডেল করে না, বরং Customer টেবিলের একটি অংশ হিসেবে স্টোর করে।


Shadow Properties এবং Backing Fields

Shadow Properties এমন প্রপার্টি যেগুলি C# কোড বা মডেল ক্লাসে ঘোষিত হয়নি, কিন্তু EF Core তাদের জন্য ডেটাবেসে কলাম তৈরি করে। এগুলি সাধারণত ডোমেন মডেল এবং ডেটাবেসের মধ্যে সম্পর্কিত কিছু অতিরিক্ত মেটাডেটা ধারণ করে, যেমন Concurrency Tokens বা Audit Columns

Backing Fields ব্যবহার করা হয় যখন আপনি ক্লাসের ভেতরের ডেটা বা প্রপার্টি কন্ট্রোল করতে চান, কিন্তু EF Core এর কাছে এক্সপোজ না করে।

Example: Shadow Property for Concurrency

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }

    public byte[] RowVersion { get; set; } // Shadow Property for Concurrency
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>()
                .Property(p => p.RowVersion)
                .IsRowVersion();
}

এখানে, RowVersion একটি Shadow Property, যা Entity Framework দ্বারা RowVersion কলাম হিসেবে ডেটাবেসে ট্র্যাক করা হবে, কিন্তু C# মডেল ক্লাসে এটি প্রকাশিত হয়নি।


Tracking এবং No-Tracking Queries

Tracking Queries এবং No-Tracking Queries দুটি গুরুত্বপূর্ণ কৌশল Entity Framework-এ পারফরম্যান্স উন্নত করার জন্য। যখন আপনি Tracking Queries ব্যবহার করেন, EF Core আপনার মডেল অবজেক্টগুলোকে ট্র্যাক করে, যাতে আপনি তাদের পরিবর্তন করতে পারেন। তবে, No-Tracking Queries ব্যবহার করলে EF Core কোন পরিবর্তন ট্র্যাক করবে না, যার ফলে সিস্টেমের পারফরম্যান্স বৃদ্ধি পায়।

No-Tracking Queries সাধারণত read-only operations এর জন্য ব্যবহার করা হয়, যেখানে আপনি শুধুমাত্র ডেটা পড়তে চান এবং সেগুলি পরিবর্তন করবেন না।

Example: No-Tracking Queries

var products = _context.Products
    .AsNoTracking() // Disables tracking for better performance
    .Where(p => p.Price > 50)
    .ToList();

এখানে, AsNoTracking() মেথডটি ব্যবহার করে, EF Core কোনো পরিবর্তন ট্র্যাক করবে না, যা পারফরম্যান্সের জন্য উপকারী।


EF Core Interceptors এবং Logging Techniques

EF Core Interceptors ব্যবহার করে আপনি SQL কুয়েরি এর কার্যকলাপ বা SaveChanges মেথডের আগে/পরে কাস্টম লজিক প্রয়োগ করতে পারেন। এটি ডিবাগিং এবং মনিটরিং করার জন্য উপকারী।

Example: Using Interceptors for Logging SQL Queries

public class ApplicationDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.AddInterceptors(new SqlCommandInterceptor());
    }
}

public class SqlCommandInterceptor : SaveChangesInterceptor
{
    public override Task<int> SaveChangesAsync(
        InterceptionContext<int> interceptionContext,
        Func<Task<int>> baseSaveChangesAsync)
    {
        Console.WriteLine("SQL Command Intercepted");
        return base.SaveChangesAsync(interceptionContext, baseSaveChangesAsync);
    }
}

এখানে, SqlCommandInterceptor কাস্টম SaveChangesInterceptor যা EF Core এর SQL কমান্ডের উপর লোগিং বা অন্যান্য কার্যক্রম করতে সক্ষম।


Entity Framework Best Practices

Entity Framework ব্যবহার করার সময় কিছু Best Practices অনুসরণ করা গুরুত্বপূর্ণ, যেগুলি আপনার কোডের পারফরম্যান্স, রক্ষণাবেক্ষণযোগ্যতা এবং নিরাপত্তা উন্নত করতে সাহায্য করবে।

1. Avoid Lazy Loading in Production

Lazy Loading যদিও ব্যবহারকারীকে সহজে সম্পর্কিত ডেটা আনতে সাহায্য করে, তবে এটি পারফরম্যান্স সমস্যা তৈরি করতে পারে। যখন ডেটার সংখ্যা বাড়ে, তখন অপ্রত্যাশিত নেটওয়ার্ক কল এবং ডেটাবেস কুয়েরি হতে পারে। তাই শুধুমাত্র প্রয়োজনীয় ক্ষেত্রে Eager Loading ব্যবহার করা উচিত।

2. Use AsNoTracking for Read-Only Queries

যদি আপনি শুধুমাত্র ডেটা পড়ছেন এবং সেটি পরিবর্তন করবেন না, তাহলে AsNoTracking() ব্যবহার করুন। এতে ডেটাবেসে কোনো পরিবর্তন ট্র্যাক হবে না, যা পারফরম্যান্স বাড়ায়।

3. Use Bulk Operations for Large Data Sets

বড় ডেটাসেটের জন্য Bulk Operations যেমন BulkInsert, BulkUpdate ব্যবহার করা উচিত, কারণ এগুলি SaveChanges এর তুলনায় অনেক দ্রুত।

4. Proper Indexing

ডেটাবেসের টেবিলগুলিতে যথাযথ indexing ব্যবহার করুন, বিশেষ করে যেগুলি অনুসন্ধান বা join অপারেশনে বেশি ব্যবহৃত হয়।

5. Avoid Multiple DbContext Instances

বিভিন্ন DbContext ইনস্ট্যান্স তৈরি করার পরিবর্তে, একটি ইনস্ট্যান্স ব্যবহার করুন এবং তা প্রয়োজনীয় স্থানে ইঞ্জেক্ট করুন। EF Core dependency injection সাপোর্ট করে, যাতে এটি ভালোভাবে ব্যবহৃত হয়।


সারাংশ

Entity Framework এর Advanced Topics এবং Best Practices অন্তর্ভুক্ত করে Complex Types, Shadow Properties, Tracking Queries, Interceptors, এবং পারফরম্যান্স অপটিমাইজেশনের কৌশল। এসব কৌশল এবং পদ্ধতি ব্যবহার করে আপনার অ্যাপ্লিকেশনের কোড আরও পরিষ্কার, নিরাপদ এবং কার্যকরী হতে পারে। Entity Framework কে সঠিকভাবে ব্যবহার করা, ডেটাবেস অ্যাক্সেস এবং পারফরম্যান্সের উন্নতি নিশ্চিত করতে সাহায্য করবে।

common.content_added_by

Complex Type এবং Value Object ব্যবহার

181
181

Complex Type এবং Value Object দুটি গুরুত্বপূর্ণ ধারণা যা সিস্টেম ডিজাইন এবং ডোমেইন ড্রিভেন ডিজাইন (DDD) এ ব্যাপকভাবে ব্যবহৃত হয়। এগুলি মূলত ডোমেইন মডেল এবং সফটওয়্যার স্থাপত্যের একটি অংশ যা ডেটা মডেলিং এবং ডেটার প্রোগ্রাম্যাটিক ব্যবহারের জন্য ব্যবহৃত হয়। এই দুটি ধারণা সাধারণত ডোমেইন অবজেক্টের মধ্যে সম্পর্ক এবং আচরণের জন্য ব্যবহৃত হয়।


Complex Type

Complex Type হল এমন একটি ডেটা টাইপ যা একাধিক প্রপার্টি বা ফিল্ড ধারণ করে কিন্তু এটি নিজে কোনো আইডেন্টিটি বা ইউনিক কীগুলি রাখে না। এটি সাধারণত একটি ডেটা ভ্যালু হিসেবে ব্যবহৃত হয় এবং এতে এক বা একাধিক প্রপার্টি থাকতে পারে। Complex Type সাধারণত একটি প্যাটার্ন হিসেবে ব্যবহৃত হয় যা বিভিন্ন ধরনের ডেটার গ্রুপকে প্রতিনিধিত্ব করে।

Complex Type এর উদাহরণ:

ধরা যাক, একটি Address (ঠিকানা) যে কোনো Customer (গ্রাহক) এর সাথে যুক্ত হতে পারে। এখানে Address এর মধ্যে Street, City, ZipCode ইত্যাদি প্রপার্টি থাকতে পারে। এই ধরনের একটি Address এর নিজস্ব কোনো ইউনিক আইডেন্টিটি নেই, বরং এটি শুধু গ্রাহকের ঠিকানা হিসেবে ব্যবহার করা হয়।

C# এ Complex Type এর উদাহরণ:

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
}

এখানে, Address একটি Complex Type, কারণ এটি একাধিক প্রপার্টি ধারণ করে কিন্তু এর নিজস্ব কোনো আইডেন্টিটি নেই। আপনি একাধিক Address অবজেক্ট একই ক্লাসের মধ্যে ব্যবহার করতে পারেন।

Complex Type ব্যবহার:

  • অপারেশন ডোমেইন: Complex Type সাধারণত ডেটা মডেলিং বা ডোমেইন লজিকের মধ্যে ব্যবহার করা হয় যেখানে ডেটার একটি গ্রুপ বা কমপ্লেক্স অবজেক্ট হিসাবে সংরক্ষণ করা প্রয়োজন।
  • ডাটাবেস মডেলিং: অনেক সময় ডেটাবেসে Complex Type ব্যবহার করা হয় যেখানে একাধিক ফিল্ড বা কলাম একসাথে একটি নির্দিষ্ট প্রপার্টি বা প্যারামিটার হিসেবে কাজ করে।

Value Object

Value Object হল এমন একটি অবজেক্ট যার কোনো ইউনিক আইডেন্টিটি নেই এবং এর সমস্ত প্রপার্টি এর মানের উপর নির্ভর করে। Value Object-গুলো সাধারণত এমন ডোমেইন মডেল অবজেক্ট যা একাধিক ক্ষেত্র (ফিল্ড) ধারণ করে কিন্তু তারা কোনো আইডেন্টিটি বা দীর্ঘমেয়াদী সত্তা (entity) ধারণ করে না। Value Object এর একটি বিশেষ বৈশিষ্ট্য হল যে, এর মান পরিবর্তনযোগ্য নয়, অর্থাৎ এটি immutable। যখন কোনো Value Object পরিবর্তিত হয়, তখন একটি নতুন ইনস্ট্যান্স তৈরি হয়, পুরানোটি পরিবর্তিত হয় না।

Value Object এর উদাহরণ:

ধরা যাক, একটি Money অবজেক্ট, যেটি দুইটি প্রপার্টি ধারণ করে: Amount এবং Currency। এটি শুধু একটি মান প্রতিনিধিত্ব করে, কোনো দীর্ঘমেয়াদী আইডেন্টিটি বা অবস্থান নেই। আপনি যখন দুটি Money অবজেক্ট তুলনা করবেন, আপনি তাদের মান (amount এবং currency) দিয়েই তুলনা করবেন, তাদের কোনো আইডেন্টিটি নয়।

C# এ Value Object এর উদাহরণ:

public class Money
{
    public decimal Amount { get; private set; }
    public string Currency { get; private set; }

    public Money(decimal amount, string currency)
    {
        Amount = amount;
        Currency = currency;
    }

    public override bool Equals(object obj)
    {
        var other = obj as Money;
        return other != null &&
               Amount == other.Amount &&
               Currency == other.Currency;
    }

    public override int GetHashCode()
    {
        return (Amount, Currency).GetHashCode();
    }
}

এখানে Money একটি Value Object, কারণ এটি নিজের মধ্যে একটি মান (amount এবং currency) ধারণ করে, এবং এটি immutable (অপরিবর্তনীয়)। যদি Money এর মান পরিবর্তন করতে হয়, তাহলে একটি নতুন অবজেক্ট তৈরি করতে হবে, পুরানোটি পরিবর্তিত হবে না।

Value Object এর বৈশিষ্ট্য:

  • Immutable: একটি Value Object কখনো পরিবর্তিত হয় না। কোনো পরিবর্তন হলে, একটি নতুন অবজেক্ট তৈরি করা হয়।
  • Equality Based on Value: Value Object এর সমতা তার মানের উপর নির্ভর করে। এর কোনো আইডেন্টিটি নেই।
  • No Identity: Value Object এর কোনো ইউনিক আইডেন্টিটি থাকে না, এটি কেবল তার মান দ্বারা চিহ্নিত হয়।

Value Object ব্যবহার:

  • ডোমেইন মডেলিং: ডোমেইন মডেলে এমন ধরনের অবজেক্ট হিসেবে ব্যবহৃত হয়, যা একটি নির্দিষ্ট মানের প্রতিনিধিত্ব করে (যেমন, টাকার পরিমাণ, পরিমাপের ইউনিট, তারিখ ইত্যাদি)।
  • ফিনান্সিয়াল ট্রানজ্যাকশনস: যেমন টাকা, পরিমাণ, মূল্য, যেগুলি নির্দিষ্ট ইউনিট (currency, quantity) দিয়ে প্রতিনিধিত্ব করা হয়।
  • ইমিউটেবল অবজেক্ট: Value Object সাধারণত ইমিউটেবল হয়, অর্থাৎ যখন কোনো প্রপার্টি পরিবর্তন করতে হয়, তখন নতুন অবজেক্ট তৈরি করা হয়।

Complex Type এবং Value Object ব্যবহারের উপকারিতা

  • ডেটা এক্সপ্রেসিভনেস: Complex Type এবং Value Object ব্যবহার করার মাধ্যমে আপনি ডোমেইন মডেলকে আরো পাঠযোগ্য এবং এক্সপ্রেসিভ করে তুলতে পারেন, যেখানে প্রতিটি অবজেক্ট তার মান এবং আচরণ স্পষ্টভাবে প্রতিনিধিত্ব করে।
  • ডেটার ইমিউটেবিলিটি: Value Object এর মাধ্যমে আপনি নিশ্চিত করতে পারেন যে একবার তৈরি হলে ডেটার মান পরিবর্তন হবে না, যা সিস্টেমের স্থিতিশীলতা এবং নির্ভরযোগ্যতা বৃদ্ধি করে।
  • ডোমেইন লজিকের সোজাসাপ্টা কাঠামো: ডোমেইন ড্রিভেন ডিজাইন (DDD) এ Complex Type এবং Value Object ব্যবহার করে সিস্টেমের বিভিন্ন লজিক এবং স্ট্রাকচার সোজা ও পরিষ্কার রাখা যায়।

সারাংশ

Complex Type এবং Value Object উভয়ই ডেটা মডেলিংয়ের ক্ষেত্রে গুরুত্বপূর্ণ কনসেপ্ট। Complex Type একাধিক প্রপার্টি ধারণ করে এবং ডোমেইন অবজেক্টের একটি অংশ হিসেবে ব্যবহৃত হয়, তবে এর নিজস্ব কোনো ইউনিক আইডেন্টিটি থাকে না। অন্যদিকে, Value Object ডোমেইন মডেলের এমন অবজেক্ট যা শুধুমাত্র তার মানের উপর ভিত্তি করে সমান বা ভিন্ন হয় এবং এটি কখনো পরিবর্তিত হয় না (immutable)। এগুলির ব্যবহার ডোমেইন মডেলকে পরিষ্কার, এক্সপ্রেসিভ, এবং কার্যকরী করে তোলে।

common.content_added_by

Shadow Properties এবং Backing Fields

208
208

Entity Framework (EF) Core তে Shadow Properties এবং Backing Fields হল এমন দুটি বৈশিষ্ট্য যা মডেল কনফিগারেশন এবং ডেটাবেস সঞ্চয়ের ক্ষেত্রে বিশেষভাবে গুরুত্বপূর্ণ। এগুলি ডেটা মডেল এবং ডেটাবেসের মধ্যে সম্পর্ক প্রতিষ্ঠা করতে এবং কার্যকরীভাবে ডেটাবেস পরিচালনা করতে সহায়তা করে।


Shadow Properties

Shadow Properties এমন প্রপার্টি যা Entity ক্লাসে সংজ্ঞায়িত করা হয় না, তবে EF Core ডেটাবেসের জন্য এটি তৈরি করে। এই প্রপার্টি আপনার ক্লাসের অংশ না হয়েও Entity Framework দ্বারা ট্র্যাক করা এবং ম্যানেজ করা হয়। Shadow Properties মূলত তখন ব্যবহৃত হয় যখন আপনার মডেলে কোন নির্দিষ্ট প্রপার্টি প্রদর্শন করা বা ম্যানেজ করা প্রয়োজন না, কিন্তু ডেটাবেসে সেই প্রপার্টি থাকতে হবে।

Shadow Properties এর ব্যবহার

EF Core তে Shadow Properties তৈরি করার জন্য, আপনি OnModelCreating মেথডে modelBuilder ব্যবহার করে এই প্রপার্টি কনফিগার করতে পারেন।

উদাহরণ:

ধরা যাক, আপনি Order ক্লাসে একটি LastModified প্রপার্টি যুক্ত করতে চান, কিন্তু আপনি এই প্রপার্টি ক্লাসের মধ্যে সংজ্ঞায়িত করতে চান না, বরং EF Core নিজেই তা ট্র্যাক করুক।

public class Order
{
    public int OrderId { get; set; }
    public string OrderName { get; set; }
    // LastModified property is a shadow property
}

এখন OnModelCreating মেথডে LastModified নামে একটি Shadow Property তৈরি করা হবে:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
        .Property<DateTime>("LastModified"); // Shadow Property
}

এখানে, LastModified প্রপার্টি Order ক্লাসে ডিফাইন করা হয়নি, কিন্তু EF Core এটি ডেটাবেসে একটি কলাম হিসেবে ট্র্যাক করবে।

Shadow Property এর অ্যাক্সেস

Shadow Properties অ্যাক্সেস করতে, EF.Property মেথড ব্যবহার করা হয়:

var lastModified = context.Entry(order).Property("LastModified").CurrentValue;

এভাবে, Shadow Property টির মান অ্যাক্সেস বা পরিবর্তন করা যায়।


Backing Fields

Backing Fields হল প্রাইভেট ফিল্ড যা একটি পাবলিক প্রপার্টি দ্বারা রিড বা রাইট করা হয়, কিন্তু EF Core ঐ প্রপার্টির মূল মানকে ট্র্যাক করার জন্য ফিল্ডটি ব্যবহার করে। এটি মূলত Encapsulation এর সুবিধা প্রদান করে, যেখানে আপনি প্রপার্টির মানের উপর নিয়ন্ত্রণ রাখতে পারেন কিন্তু ডেটাবেস স্তরে এই মানটি EF Core দ্বারা ম্যানেজ করা হয়।

EF Core তে Backing Fields ব্যবহার করার প্রধান উদ্দেশ্য হল, ডেটাবেসের সঙ্গে সম্পর্কিত কোন প্রপার্টি ম্যানিপুলেট করার সময় আপনি সেই প্রপার্টির getter বা setter মেথডের মধ্যে কাস্টম লজিক প্রয়োগ করতে পারেন।

Backing Fields এর ব্যবহার

EF Core এ Backing Fields কনফিগার করতে, আপনি সাধারণত HasField এবং UsePropertyAccessMode মেথড ব্যবহার করেন।

উদাহরণ:

ধরা যাক, আপনি Person ক্লাসে একটি প্রপার্টি FullName তৈরি করতে চান যা শুধুমাত্র FirstName এবং LastName ফিল্ড দ্বারা তৈরি হবে, তবে প্রপার্টি হিসাবে FullName প্রদর্শিত হবে।

public class Person
{
    private string _fullName;
    
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // Backing field for FullName property
    public string FullName
    {
        get => _fullName ?? $"{FirstName} {LastName}";
        private set => _fullName = value;
    }
}

এখানে, FullName প্রপার্টি FirstName এবং LastName ফিল্ডের মানের ওপর নির্ভরশীল, এবং FullName এর জন্য একটি Backing Field _fullName ব্যবহৃত হচ্ছে।

Backing Field কনফিগারেশন

এখন OnModelCreating মেথডে Backing Field কনফিগার করা যাবে:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .Property(p => p.FullName)
        .HasField("_fullName"); // Set the backing field for FullName
}

এভাবে, EF Core এই ফিল্ডটিকে ট্র্যাক করে, এবং যখন FullName পরিবর্তিত হয়, তখন _fullName ফিল্ডে পরিবর্তন ঘটে।


Shadow Properties এবং Backing Fields এর মধ্যে পার্থক্য

বিষয়Shadow PropertiesBacking Fields
সংজ্ঞায়িত করাক্লাসে ডিফাইন করা হয় না, EF Core দ্বারা তৈরি হয়।ক্লাসে প্রাইভেট ফিল্ড দিয়ে সংজ্ঞায়িত হয়।
কনফিগারেশনmodelBuilder.Property দিয়ে কনফিগার করা হয়।modelBuilder.Property.HasField দিয়ে কনফিগার করা হয়।
ব্যবহারডেটাবেসে কলাম হিসাবে ব্যবহার করা হয়।প্রপার্টি ও ফিল্ডের মধ্যে সম্পর্ক স্থাপন করা হয়।
অ্যাক্সেসEF.Property মেথডের মাধ্যমে অ্যাক্সেস করা হয়।সাধারণ প্রপার্টি gettersetter মেথডের মাধ্যমে অ্যাক্সেস করা হয়।

উপসংহার

Shadow Properties এবং Backing Fields উভয়ই EF Core এর জন্য শক্তিশালী টুলস যা আপনাকে ডেটাবেসের সঠিক ব্যবস্থাপনা এবং প্রপার্টির উপর নিয়ন্ত্রণ রাখতে সাহায্য করে। Shadow Properties ব্যবহার করে আপনি প্রপার্টি ছাড়া ডেটাবেস টেবিল তৈরি করতে পারবেন, যেখানে Backing Fields দিয়ে আপনি ডেটাবেস এবং মডেল লেভেলে কাস্টম লজিক প্রয়োগ করতে পারবেন।

common.content_added_by

Tracking এবং No-Tracking Queries

204
204

Tracking এবং No-Tracking হল Entity Framework এর দুটি গুরুত্বপূর্ণ কৌশল যা ডেটাবেস থেকে তথ্য পড়ার সময় কীভাবে রেকর্ডের পরিবর্তন ট্র্যাক করা হবে তা নিয়ন্ত্রণ করে। এগুলি প্রধানত পারফরম্যান্স এবং মেমরি ব্যবহারের সাথে সম্পর্কিত, এবং বিভিন্ন পরিস্থিতিতে এর ব্যবহার আলাদা হতে পারে।


Tracking Queries

Tracking Queries হল Entity Framework-এর ডিফল্ট আচরণ যেখানে ডেটাবেস থেকে একটি রেকর্ড পড়ার সময়, সেই রেকর্ডটি Entity Framework এর Change Tracker দ্বারা ট্র্যাক করা হয়। এর মানে হল যে, Entity Framework সেই রেকর্ডের উপর যে কোন পরিবর্তন চিহ্নিত করবে এবং SaveChanges() কল করার পর, সেই পরিবর্তন ডেটাবেসে সেভ হবে।

এটি সাধারণত তখন ব্যবহার করা হয় যখন আপনি রেকর্ডগুলি পরিবর্তন করতে চান এবং সেগুলির উপর কিছু অ্যাকশন নিতে চান, যেমন আপডেট বা ডিলিট করা।

Tracking Example:

var student = db.Students.FirstOrDefault(s => s.StudentId == 1);
student.Name = "Updated Name";

// EF will track the changes to this student
db.SaveChanges();  // The update will be saved to the database

এখানে:

  • student অবজেক্টটি Entity Framework এর Change Tracker দ্বারা ট্র্যাক হবে, তাই SaveChanges() কল করার পর সেই পরিবর্তন ডেটাবেসে আপডেট হবে।

No-Tracking Queries

No-Tracking Queries তখন ব্যবহার করা হয় যখন আপনি শুধুমাত্র ডেটা পড়তে চান এবং ডেটাবেসে কোনো পরিবর্তন করতে চান না। এই কৌশলে Entity Framework ডেটাবেস থেকে ডেটা লোড করার সময় Change Tracker ব্যবহার করে না। এর ফলে, Tracking Queries এর তুলনায় মেমরি ব্যবহারের পরিমাণ কম হয় এবং পারফরম্যান্স ভালো হয়, বিশেষত যখন শুধু রিড অপারেশন করা হচ্ছে এবং ডেটাবেসে কোনো আপডেট বা ডিলিট করতে হবে না।

No-Tracking Example:

var students = db.Students.AsNoTracking().ToList();

এখানে:

  • .AsNoTracking() মেথডটি নির্দেশ করে যে Entity Framework এই কুয়েরি থেকে প্রাপ্ত রেকর্ডগুলিকে ট্র্যাক করবে না।
  • এতে করে Change Tracker ব্যবহার করা হয় না এবং এটি পারফরম্যান্সের ক্ষেত্রে অনেক দ্রুত হয়, বিশেষ করে যখন শুধুমাত্র ডেটা রিড করা হচ্ছে।

Tracking এবং No-Tracking এর মধ্যে পার্থক্য

বৈশিষ্ট্যTracking QueriesNo-Tracking Queries
ডেটা ট্র্যাকিংEntity Framework রেকর্ডের পরিবর্তন ট্র্যাক করে।রেকর্ডের কোনো পরিবর্তন ট্র্যাক করা হয় না।
পারফরম্যান্সমেমরি এবং পারফরম্যান্সের উপর বেশি প্রভাব পড়ে, কারণ Entity Framework প্রতিটি রেকর্ডের পরিবর্তন ট্র্যাক করে।দ্রুত, কারণ ডেটা শুধু পড়া হয়, পরিবর্তন ট্র্যাক করা হয় না।
ব্যবহারযখন আপনি রেকর্ড পরিবর্তন (যেমন, Update বা Delete) করতে চান।যখন আপনি শুধুমাত্র ডেটা রিড করতে চান এবং পরিবর্তন করতে চান না।
মেমরি ব্যবহারবেশি মেমরি ব্যবহার করে কারণ রেকর্ডের স্টেট ট্র্যাক করা হয়।কম মেমরি ব্যবহার হয় কারণ কোনো স্টেট ট্র্যাক করা হয় না।

কোন পরিস্থিতিতে Tracking এবং No-Tracking ব্যবহার করবেন?

Tracking Queries ব্যবহার করার পরিস্থিতি:

  1. যখন আপনি কোনো রেকর্ডে পরিবর্তন (এডিট বা ডিলিট) করতে চান এবং সেগুলি SaveChanges() দিয়ে সেভ করতে চান।
  2. যখন আপনি একটি নির্দিষ্ট রেকর্ডের পরিবর্তন ট্র্যাক করতে চান, যেমন CRUD অপারেশনস এর সময়।

No-Tracking Queries ব্যবহার করার পরিস্থিতি:

  1. যখন আপনি লং-লিস্ট বা লিস্ট ভিউ এ শুধু ডেটা প্রদর্শন করতে চান এবং কোনো পরিবর্তন করতে চান না।
  2. যখন আপনি ডেটার জন্য রিড-ওনলি অ্যাক্সেস চান এবং এর জন্য কম মেমরি ও পারফরম্যান্সে সুবিধা চান।

No-Tracking ব্যবহার করার সময় এর সুবিধা

  • উন্নত পারফরম্যান্স: যখন আপনি শুধুমাত্র ডেটা রিড করছেন, তখন No-Tracking ব্যবহারের ফলে অ্যাপ্লিকেশন কম মেমরি ব্যবহার করে এবং দ্রুত ডেটা প্রদান করে।
  • কম মেমরি ব্যবহার: Tracking না করায় Change Tracker মেমরিতে অতিরিক্ত তথ্য সংরক্ষণ করে না, যা মেমরি ব্যবহারের পরিমাণ কমায়।

No-Tracking এর সীমানা:

  • No-Tracking ব্যবহারের সময়, আপনি যদি রেকর্ডগুলিতে কোনো পরিবর্তন করতে চান তবে এটি সম্ভব হবে না। ডেটা শুধুমাত্র পড়া হয় এবং পরিবর্তন ট্র্যাক করা হয় না।

AsNoTracking() Method in Detail

AsNoTracking() মেথডটি কেবল IQueryable কুয়েরি সম্পর্কিত, তাই এটি কেবল লিস্টে রিটার্ন হওয়া রেকর্ডগুলির জন্য কাজ করে। এটি কুয়েরি স্ট্রিমিং এর সময় Entity Framework কে বলছে যে, কোনো পরিবর্তন ট্র্যাক করো না, যেহেতু এই রেকর্ডগুলির জন্য কোনো আপডেট বা ডিলিট হবে না।

var students = db.Students.AsNoTracking().Where(s => s.Age > 20).ToList();

এখানে:

  • Where কন্ডিশনের মাধ্যমে ডেটা ফিল্টার করা হয়েছে, কিন্তু .AsNoTracking() মেথডের মাধ্যমে এই ডেটার কোনো পরিবর্তন ট্র্যাক করা হবে না।

উপসংহার

Tracking Queries এবং No-Tracking Queries এর মধ্যে পার্থক্য মেমরি ব্যবহারের ও পারফরম্যান্সের দিক থেকে গুরুত্বপূর্ণ। Tracking Queries তখনই ব্যবহার করুন যখন আপনি ডেটার সাথে পরিবর্তন করতে চান এবং No-Tracking তখনই ব্যবহার করুন যখন আপনি শুধু রিড-অপারেশন করছেন এবং পারফরম্যান্সে আরও উন্নতি চান।

common.content_added_by

EF Core Interceptors এবং Logging Techniques

231
231

EF Core Interceptors এবং Logging হল দুইটি শক্তিশালী ফিচার যা ডেটাবেস অ্যাক্সেস এবং এর কার্যকলাপ ট্র্যাক করতে ব্যবহৃত হয়। Interceptors আপনাকে EF Core-এর বিভিন্ন অপারেশন যেমন, SaveChanges, Query Execution, Transaction ইত্যাদিতে হস্তক্ষেপ করার সুযোগ দেয়, এবং Logging আপনাকে আপনার অ্যাপ্লিকেশন এবং ডেটাবেসের কার্যকলাপের বিস্তারিত ট্রেস বা লগ তৈরি করতে সাহায্য করে। এগুলোর মাধ্যমে আপনি আরও ভাল ডিবাগিং, পারফরম্যান্স মনিটরিং এবং কাস্টম লগিং ফিচার তৈরি করতে পারবেন।


EF Core Interceptors

EF Core Interceptors হল এমন মেকানিজম যা আপনাকে EF Core-এর বিভিন্ন প্রসেসে হস্তক্ষেপ করার সুযোগ দেয়। ইন্টারসেপ্টর ব্যবহার করে আপনি SQL কমান্ড, ডেটাবেস ট্রানজেকশন, SaveChanges ইত্যাদির আগে বা পরে কাস্টম লজিক এক্সিকিউট করতে পারেন। ইন্টারসেপ্টরের মাধ্যমে আপনি লগিং, পারফরম্যান্স ট্র্যাকিং, সিকিউরিটি চেক, এবং আরো অনেক ধরনের কার্যকলাপ বাস্তবায়ন করতে পারেন।

EF Core Interceptors কীভাবে কাজ করে

EF Core ইন্টারসেপ্টরগুলি সাধারণত একটি নির্দিষ্ট DbContext এর ওপর কাজ করে। আপনি DbContext বা DbCommand এর ইন্টারসেপ্টর তৈরি করতে পারেন, যা আপনার প্রয়োজনে কাস্টমাইজড হতে পারে।

Interceptor ব্যবহার করার উপায়

EF Core তে ইন্টারসেপ্টর যুক্ত করার জন্য আপনাকে IDbCommandInterceptor, IChangeTrackerInterceptor, অথবা ISaveChangesInterceptor ইন্টারফেসগুলির মধ্যে যেকোনো একটিতে ইমপ্লিমেন্টেশন করতে হবে।

উদাহরণস্বরূপ, একটি সিম্পল SaveChangesInterceptor তৈরি করা যেটি SaveChanges() মেথডে হস্তক্ষেপ করবে এবং তখন কিছু লগ বা কাস্টম লজিক কার্যকর হবে:

public class MySaveChangesInterceptor : ISaveChangesInterceptor
{
    public int SavedChanges(SaveChangesContext saveChangesContext)
    {
        // Custom logic before save
        Console.WriteLine("Saving changes...");
        return 0; // Return the result of the save operation
    }

    public void SaveChangesFailed(SaveChangesFailedContext saveChangesFailedContext)
    {
        // Handle failure
        Console.WriteLine("Failed to save changes.");
    }

    // Optionally, implement other methods for detecting change events
}

এরপর, ইন্টারসেপ্টরটি DbContext এ রেজিস্টার করতে হবে:

public class MyDbContext : DbContext
{
    private readonly MySaveChangesInterceptor _saveChangesInterceptor;

    public MyDbContext(DbContextOptions<MyDbContext> options, MySaveChangesInterceptor saveChangesInterceptor) 
        : base(options)
    {
        _saveChangesInterceptor = saveChangesInterceptor;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.AddInterceptors(_saveChangesInterceptor);
    }
}

এখন, যখন SaveChanges() মেথডটি কল হবে, তখন আপনার কাস্টম ইন্টারসেপ্টর সক্রিয় হয়ে যাবে এবং সেটি ডেটা সেভ করার আগে বা পরে কার্যকর হবে।


Logging Techniques in EF Core

Logging হল একটি গুরুত্বপূর্ণ টেকনিক যা অ্যাপ্লিকেশনের কার্যকলাপ, ডেটাবেস কুয়েরি, পারফরম্যান্স, এবং ত্রুটি ট্র্যাক করতে ব্যবহৃত হয়। EF Core-এ লোগিং খুবই গুরুত্বপূর্ণ, কারণ এটি ডেটাবেস কুয়েরি, ট্রানজেকশন, এবং অন্যান্য অপারেশনের ডিবাগিং এবং পারফরম্যান্স টিউনিংয়ে সাহায্য করে। EF Core এর লগিং সিস্টেম মূলত Microsoft.Extensions.Logging লাইব্রেরির মাধ্যমে কাজ করে।

EF Core-এ Logging সক্ষম করা

EF Core এর লোগিং সিস্টেম কনফিগার করতে আপনাকে ILogger ইন্টারফেস ব্যবহার করতে হবে, যা সাধারণত ILoggerFactory এর মাধ্যমে কনফিগার করা হয়।

public class MyDbContext : DbContext
{
    private readonly ILoggerFactory _loggerFactory;

    public MyDbContext(DbContextOptions<MyDbContext> options, ILoggerFactory loggerFactory)
        : base(options)
    {
        _loggerFactory = loggerFactory;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // Enabling logging
        optionsBuilder.UseLoggerFactory(_loggerFactory);
        optionsBuilder.EnableSensitiveDataLogging(); // Enables logging of sensitive data, like SQL queries
    }
}

এখানে:

  • UseLoggerFactory ব্যবহার করে আপনি EF Core-এ লগিং সক্রিয় করেন।
  • EnableSensitiveDataLogging অপশনটি ব্যবহার করলে লগে স্নিগ্ধ ডেটা যেমন SQL কুয়েরি সহ বিস্তারিত লগ পাওয়া যায়।

SQL Query Logging

EF Core-এর লগিং সিস্টেমটি SQL কুয়েরি লগ করতে সক্ষম। আপনি লগিং সক্রিয় করার পর, EF Core আপনার কুয়েরি ও অন্যান্য কার্যকলাপ কনসোল বা ফাইল আউটপুটে রেকর্ড করবে। এটি ডিবাগিং এবং পারফরম্যান্স অপটিমাইজেশন এর জন্য খুবই কার্যকর।

var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionsBuilder.UseSqlServer("YourConnectionString")
              .EnableSensitiveDataLogging()
              .UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()));

using (var context = new MyDbContext(optionsBuilder.Options))
{
    var customers = context.Customers.Where(c => c.City == "New York").ToList();
}

এটি SQL কুয়েরি আউটপুট কনসোলে লগ করবে, যা আপনাকে কুয়েরি এবং তার এক্সিকিউশন টাইম বিশ্লেষণ করতে সাহায্য করবে।


Advanced Logging Techniques

Log Filter Configuration

আপনি চাইলে শুধু নির্দিষ্ট টাইপের লগগুলোই রেকর্ড করতে পারেন, যেমন কেবল Warning, Error, বা Information লগ। এটি আপনাকে অ্যাপ্লিকেশনটি অপটিমাইজ করতে এবং খুব বেশি লগ ডেটা না জমাতে সহায়তা করবে।

public static ILoggerFactory CreateLoggerFactory()
{
    return LoggerFactory.Create(builder =>
    {
        builder
            .AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Information)
            .AddConsole();
    });
}

File-based Logging

লগগুলোকে ফাইলে রেকর্ড করতে File Logger ব্যবহার করা যেতে পারে। আপনি Serilog, NLog, বা Log4Net এর মতো জনপ্রিয় ফাইল লগিং লাইব্রেরি ব্যবহার করতে পারেন EF Core লগিংয়ের জন্য।


Conclusion

EF Core Interceptors এবং Logging Techniques আপনাকে ডেটাবেসের কার্যকলাপের উপর পূর্ণ নিয়ন্ত্রণ এবং পর্যবেক্ষণ প্রদান করে। এগুলির মাধ্যমে আপনি transaction tracking, performance monitoring, এবং error handling আরও দক্ষভাবে পরিচালনা করতে পারবেন। লগিং এবং ইন্টারসেপ্টর ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনটির কার্যকারিতা ও নিরাপত্তা নিশ্চিত করা সম্ভব, এবং প্রয়োজনে ডিবাগিংয়ের সময় ভুলগুলো দ্রুত চিহ্নিত করা যায়।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion